/*
 * (C) Copyright 2003
 * David Müller ELSOFT AG Switzerland. d.mueller@elsoft.ch
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

/************************************************
 * NAME	    : s3c24x0.h
 * Version  : 31.3.2003
 *
 * common stuff for SAMSUNG S3C24X0 SoC
 ************************************************/

#ifndef __S3C24X0_H__
#define __S3C24X0_H__


typedef volatile unsigned char S3C24X0_REG8;
typedef volatile unsigned short    S3C24X0_REG16;
typedef volatile unsigned long    S3C24X0_REG32;


/* INTERRUPT (see manual chapter 14) */
typedef struct {
    S3C24X0_REG32   SRCPND;
    S3C24X0_REG32   INTMOD;
    S3C24X0_REG32   INTMSK;
    S3C24X0_REG32   PRIORITY;
    S3C24X0_REG32   INTPND;
    S3C24X0_REG32   INTOFFSET;
    S3C24X0_REG32   SUBSRCPND;
    S3C24X0_REG32   INTSUBMSK;

} /*__attribute__((__packed__))*/ S3C24X0_INTERRUPT;



/* DMAS (see manual chapter 8) */
typedef struct {
    S3C24X0_REG32   DISRC;

    S3C24X0_REG32   DISRCC;

    S3C24X0_REG32   DIDST;

    S3C24X0_REG32   DIDSTC;

    S3C24X0_REG32   DCON;
    S3C24X0_REG32   DSTAT;
    S3C24X0_REG32   DCSRC;
    S3C24X0_REG32   DCDST;
    S3C24X0_REG32   DMASKTRIG;
    S3C24X0_REG32   res[7];

} /*__attribute__((__packed__))*/ S3C24X0_DMA;


typedef struct {
    S3C24X0_DMA dma[4];
} /*__attribute__((__packed__))*/ S3C24X0_DMAS;


typedef struct {
    S3C24X0_REG32   GPACON;
    S3C24X0_REG32   GPADAT;
    S3C24X0_REG32   res1[2];
    S3C24X0_REG32   GPBCON;
    S3C24X0_REG32   GPBDAT;
    S3C24X0_REG32   GPBUP;
    S3C24X0_REG32   res2;
    S3C24X0_REG32   GPCCON;
    S3C24X0_REG32   GPCDAT;
    S3C24X0_REG32   GPCUP;
    S3C24X0_REG32   res3;
    S3C24X0_REG32   GPDCON;
    S3C24X0_REG32   GPDDAT;
    S3C24X0_REG32   GPDUP;
    S3C24X0_REG32   res4;
    S3C24X0_REG32   GPECON;
    S3C24X0_REG32   GPEDAT;
    S3C24X0_REG32   GPEUP;
    S3C24X0_REG32   res5;
    S3C24X0_REG32   GPFCON;
    S3C24X0_REG32   GPFDAT;
    S3C24X0_REG32   GPFUP;
    S3C24X0_REG32   res6;
    S3C24X0_REG32   GPGCON;
    S3C24X0_REG32   GPGDAT;
    S3C24X0_REG32   GPGUP;
    S3C24X0_REG32   res7;
    S3C24X0_REG32   GPHCON;
    S3C24X0_REG32   GPHDAT;
    S3C24X0_REG32   GPHUP;
    S3C24X0_REG32   res8;

    S3C24X0_REG32   MISCCR;
    S3C24X0_REG32   DCLKCON;
    S3C24X0_REG32   EXTINT0;
    S3C24X0_REG32   EXTINT1;
    S3C24X0_REG32   EXTINT2;
    S3C24X0_REG32   EINTFLT0;
    S3C24X0_REG32   EINTFLT1;
    S3C24X0_REG32   EINTFLT2;
    S3C24X0_REG32   EINTFLT3;
    S3C24X0_REG32   EINTMASK;
    S3C24X0_REG32   EINTPEND;
    S3C24X0_REG32   GSTATUS0;
    S3C24X0_REG32   GSTATUS1;
    S3C24X0_REG32   GSTATUS2;
    S3C24X0_REG32   GSTATUS3;
    S3C24X0_REG32   GSTATUS4;

    /* s3c2440 */
    S3C24X0_REG32   res9[4];
    S3C24X0_REG32   GPJCON;
    S3C24X0_REG32   GPJDAT;
    S3C24X0_REG32   GPJUP;

}S3C24X0_GPIO;

/* PWM TIMER (see manual chapter 10) */
typedef struct {
    S3C24X0_REG32   TCNTB;
    S3C24X0_REG32   TCMPB;
    S3C24X0_REG32   TCNTO;
} /*__attribute__((__packed__))*/ S3C24X0_TIMER;

typedef struct {
    S3C24X0_REG32   TCFG0;
    S3C24X0_REG32   TCFG1;
    S3C24X0_REG32   TCON;
    S3C24X0_TIMER   ch[4];
    S3C24X0_REG32   TCNTB4;
    S3C24X0_REG32   TCNTO4;
} /*__attribute__((__packed__))*/ S3C24X0_TIMERS;



/* USB DEVICE (see manual chapter 13) */
typedef struct {
#ifdef __BIG_ENDIAN
    S3C24X0_REG8    res[3];
    S3C24X0_REG8    EP_FIFO_REG;
#else /*  little endian */
    S3C24X0_REG8    EP_FIFO_REG;
    S3C24X0_REG8    res[3];
#endif
} /*__attribute__((__packed__))*/ S3C24X0_USB_DEV_FIFOS;

typedef struct {
#ifdef __BIG_ENDIAN
    S3C24X0_REG8    res1[3];
    S3C24X0_REG8    EP_DMA_CON;
    S3C24X0_REG8    res2[3];
    S3C24X0_REG8    EP_DMA_UNIT;
    S3C24X0_REG8    res3[3];
    S3C24X0_REG8    EP_DMA_FIFO;
    S3C24X0_REG8    res4[3];
    S3C24X0_REG8    EP_DMA_TTC_L;
    S3C24X0_REG8    res5[3];
    S3C24X0_REG8    EP_DMA_TTC_M;
    S3C24X0_REG8    res6[3];
    S3C24X0_REG8    EP_DMA_TTC_H;
#else /*  little endian */
    S3C24X0_REG8    EP_DMA_CON;
    S3C24X0_REG8    res1[3];
    S3C24X0_REG8    EP_DMA_UNIT;
    S3C24X0_REG8    res2[3];
    S3C24X0_REG8    EP_DMA_FIFO;
    S3C24X0_REG8    res3[3];
    S3C24X0_REG8    EP_DMA_TTC_L;
    S3C24X0_REG8    res4[3];
    S3C24X0_REG8    EP_DMA_TTC_M;
    S3C24X0_REG8    res5[3];
    S3C24X0_REG8    EP_DMA_TTC_H;
    S3C24X0_REG8    res6[3];
#endif
} /*__attribute__((__packed__))*/ S3C24X0_USB_DEV_DMAS;

typedef struct {
#ifdef __BIG_ENDIAN
    S3C24X0_REG8    res1[3];
    S3C24X0_REG8    FUNC_ADDR_REG;
    S3C24X0_REG8    res2[3];
    S3C24X0_REG8    PWR_REG;
    S3C24X0_REG8    res3[3];
    S3C24X0_REG8    EP_INT_REG;
    S3C24X0_REG8    res4[15];
    S3C24X0_REG8    USB_INT_REG;
    S3C24X0_REG8    res5[3];
    S3C24X0_REG8    EP_INT_EN_REG;
    S3C24X0_REG8    res6[15];
    S3C24X0_REG8    USB_INT_EN_REG;
    S3C24X0_REG8    res7[3];
    S3C24X0_REG8    FRAME_NUM1_REG;
    S3C24X0_REG8    res8[3];
    S3C24X0_REG8    FRAME_NUM2_REG;
    S3C24X0_REG8    res9[3];
    S3C24X0_REG8    INDEX_REG;
    S3C24X0_REG8    res10[7];
    S3C24X0_REG8    MAXP_REG;
    S3C24X0_REG8    res11[3];
    S3C24X0_REG8    EP0_CSR_IN_CSR1_REG;
    S3C24X0_REG8    res12[3];
    S3C24X0_REG8    IN_CSR2_REG;
    S3C24X0_REG8    res13[7];
    S3C24X0_REG8    OUT_CSR1_REG;
    S3C24X0_REG8    res14[3];
    S3C24X0_REG8    OUT_CSR2_REG;
    S3C24X0_REG8    res15[3];
    S3C24X0_REG8    OUT_FIFO_CNT1_REG;
    S3C24X0_REG8    res16[3];
    S3C24X0_REG8    OUT_FIFO_CNT2_REG;
#else /*  little endian */
    S3C24X0_REG8    FUNC_ADDR_REG;
    S3C24X0_REG8    res1[3];
    S3C24X0_REG8    PWR_REG;
    S3C24X0_REG8    res2[3];
    S3C24X0_REG8    EP_INT_REG;
    S3C24X0_REG8    res3[15];
    S3C24X0_REG8    USB_INT_REG;
    S3C24X0_REG8    res4[3];
    S3C24X0_REG8    EP_INT_EN_REG;
    S3C24X0_REG8    res5[15];
    S3C24X0_REG8    USB_INT_EN_REG;
    S3C24X0_REG8    res6[3];
    S3C24X0_REG8    FRAME_NUM1_REG;
    S3C24X0_REG8    res7[3];
    S3C24X0_REG8    FRAME_NUM2_REG;
    S3C24X0_REG8    res8[3];
    S3C24X0_REG8    INDEX_REG;
    S3C24X0_REG8    res9[7];
    S3C24X0_REG8    MAXP_REG;
    S3C24X0_REG8    res10[3];
    S3C24X0_REG8    EP0_CSR_IN_CSR1_REG;
    S3C24X0_REG8    res11[3];
    S3C24X0_REG8    IN_CSR2_REG;
    S3C24X0_REG8    res12[7];
    S3C24X0_REG8    OUT_CSR1_REG;
    S3C24X0_REG8    res13[3];
    S3C24X0_REG8    OUT_CSR2_REG;
    S3C24X0_REG8    res14[3];
    S3C24X0_REG8    OUT_FIFO_CNT1_REG;
    S3C24X0_REG8    res15[3];
    S3C24X0_REG8    OUT_FIFO_CNT2_REG;
    S3C24X0_REG8    res16[3];
#endif /*  __BIG_ENDIAN */
    S3C24X0_REG32   res17[8];
    S3C24X0_USB_DEV_FIFOS   fifo[5];
    S3C24X0_REG32   res18[11];
    S3C24X0_USB_DEV_DMAS    ep1;
    S3C24X0_USB_DEV_DMAS    ep2;
    S3C24X0_REG8    res19[16];
    S3C24X0_USB_DEV_DMAS    ep3;
    S3C24X0_USB_DEV_DMAS    ep4;
} /*__attribute__((__packed__))*/ S3C24X0_USB_DEVICE;


/* WATCH DOG TIMER (see manual chapter 18) */
typedef struct {
    S3C24X0_REG32   WTCON;
    S3C24X0_REG32   WTDAT;
    S3C24X0_REG32   WTCNT;
} /*__attribute__((__packed__))*/ S3C24X0_WATCHDOG;

typedef struct {
    S3C24X0_REG32   LOCKTIME;
    S3C24X0_REG32   MPLLCON;
    S3C24X0_REG32   UPLLCON;
    S3C24X0_REG32   CLKCON;
    S3C24X0_REG32   CLKSLOW;
    S3C24X0_REG32   CLKDIVN;
    S3C24X0_REG32   CAMDIVN;    /* for s3c2440, by www.embedsky.net */
} /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER;

#endif /*__S3C24X0_H__*/
